﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.Security;
using RazakiBLL;
using RazakiBLL.Managers;

/// <summary>
///در این 
///Utility
///باید مواردی درج شود که مربوط به 
///UI
///است و 
///Bussiness
///نمی تواند درگیر آن شود.
/// </summary>
public static class UtilitiesUI
{

    #region >>>FIELD<<<

    private static readonly string _showImage = string.Empty;

    private static readonly string _getFullNameOfUser = string.Empty;

    private static readonly string _getQueryString = string.Empty;

    #endregion

    #region >>>PROPERTY<<<

    public static string ScriptsRoot
    {
        get
        {
            string root = "Scripts";

#if !DEBUG
            root += "Compressed";
#endif

            return root;
        }
    }

    public static string StylesRoot
    {
        get
        {
            string root = "Styles";

#if !DEBUG
            root += "Compressed";
#endif

            return root;
        }
    }

    #endregion

    #region >>>METHOD<<<

    public static bool AddStartupScript(Page page, Type type, string key, string script, bool addScriptTag = true)
    {
        string targetScript = string.Format("$(document).ready(function() {{{0}}});", script);

        page.ClientScript.RegisterStartupScript(type, key + "Script", targetScript, addScriptTag);

        return true;
    }

    /// <summary>
    /// آیا مشترک جاری وارد سایت شده است؟
    /// login
    /// </summary>
    /// <returns></returns>
    public static bool CurrentContactIsUser()
    {
        return HttpContext.Current.User.Identity.IsAuthenticated;
    }

    public static Guid GetCurrentUserId()
    {
        MembershipUser membershipUser = Membership.GetUser();
        return (Guid)membershipUser.ProviderUserKey;
    }

    /// <summary>
    /// در این متد از
    /// Membership
    /// استفاده شده که مربوط به
    /// asp.net (UI)
    /// است.
    /// </summary>
    /// <param name="userId"></param>
    /// <returns></returns>
    public static string GetFullNameOfUser(Guid userId)
    {
        lock (_getFullNameOfUser)
        {
            string fullName;
            UowRazaki uowRazaki = new UowRazaki();
            var userDetail = uowRazaki.UserDetailRepository.GetById(userId);

            if (userDetail != null)
            {
                fullName = string.Format("{0} {1}", userDetail.FirstName, userDetail.LastName);
            }
            else
            {
                var membershipUser = Membership.GetUser(userId);
                fullName = membershipUser.UserName;
            }

            return fullName;
        }
    }

    public static bool IsIdForCurrentUser(Guid userId)
    {
        return GetCurrentUserId() == userId;
    }

    public static bool IsAdmin()
    {
        return HttpContext.Current.User.IsInRole(ERoles.AdminSite.ToString());
    }

    public static string ShowImage(byte[] image)
    {
        lock (_showImage)
        {
            string name = UtilitiesBLL.GenerateGuid();

            SessionSet(name, image);

            return string.Format("~/PagesPublic/FileWrite.ashx{0}",
                                 SetQueryString(new Dictionary<string, string> { { "name", name }, { "type", "image" } }));
        }
    }

    public static void SessionSet(string name, object value)
    {
        HttpContext.Current.Session[name] = value;
    }

    public static T SessionGet<T>(string name)
    {
        var value = HttpContext.Current.Session[name];
        var castedValue = Convert.ChangeType(value, typeof(T));

        return (T)castedValue;
    }

    public static void SessionClear(string name)
    {
        HttpContext.Current.Session.Remove(name);
    }

    public static T GetSimpleQueryString<T>(string name)
    {
        string value = HttpContext.Current.Request.QueryString[name];
        var castedValue = Convert.ChangeType(value, typeof(T));

        return (T)castedValue;
    }

    public static T GetQueryString<T>(string name, bool isEncryptedDynamic = true)
    {
        lock (_getQueryString)
        {
            string value = HttpContext.Current.Request.QueryString[name];

            //خطوط زیر بدلیل سازگاری آدرس فرم ها با سئو کامنت شده اند
            //در واقع با کپی کردن آدرس فرم در هر زمانی می توان به اطلاعات آن دسترسی پیدا کرد
            //if (isEncryptedDynamic)
            //    value = DecryptWithUrlDecode(value, UtilitiesBLL.GetUserUniqueKey());
            //else
            //    value = DecryptWithUrlDecode(value, null, false);
            value = DecryptWithUrlDecode(value, null, false);

            var castedValue = Convert.ChangeType(value, typeof(T));

            return (T)castedValue;
        }
    }

    public static string SetQueryString(Dictionary<string, string> namesValues, bool isEncryptedDynamic = true)
    {
        string result = "?";

        //خطوط زیر بدلیل سازگاری آدرس فرم ها با سئو کامنت شده اند
        //در واقع با کپی کردن آدرس فرم در هر زمانی می توان به اطلاعات آن دسترسی پیدا کرد
        //namesValues.Select(
        //    x =>
        //    string.Format("{0}={1}", x.Key,
        //                  EncryptWithUrlEncode(x.Value, UtilitiesBLL.GetUserUniqueKey(), isEncryptedDynamic))).
        //    ToList().ForEach(x => result += string.Format("{0}&", x));
        namesValues.Select(
            x =>
            string.Format("{0}={1}", x.Key,
                          EncryptWithUrlEncode(x.Value, null, false))).
            ToList().ForEach(x => result += string.Format("{0}&", x));

        result = result.Remove(result.LastIndexOf("&"));

        return result;
    }

    private static string EncryptWithUrlEncode(string plain, string key, bool isEncryptedDynamic = true)
    {
        string result;

        if (isEncryptedDynamic)
            result = Encryption.Encrypt(plain, key);
        else
            result = Encryption.Encrypt(plain, null, true);

        result = HttpContext.Current.Server.UrlEncode(result);

        return result;
    }

    private static string DecryptWithUrlDecode(string cipher, string key, bool isEncryptedDynamic = true)
    {
        string result;

        cipher = HttpContext.Current.Server.UrlDecode(cipher);
        if (isEncryptedDynamic)
            result = Encryption.Decrypt(cipher, key);
        else
            result = Encryption.Decrypt(cipher, null, true);

        return result;
    }

    /// <summary>
    /// مربوط به جمله های نمایش داده شده در 
    /// UI
    /// هستند.
    /// </summary>
    /// <param name="sentences"></param>
    /// <returns></returns>
    public static string Sentences(ESentences sentences)
    {
        string sentence = string.Empty;

        switch (sentences)
        {
            case ESentences.success:
                sentence = "عملیات با موفقیت انجام شد.";
                break;
            case ESentences.error:
                sentence = "عملیات با خطا مواجه شد.";
                break;
            case ESentences.requiredSelect:
                sentence = "لطفاً {0} را انتخاب نمایید.";
                break;
            case ESentences.requiredFill:
                sentence = "لطفاً {0} را پر نمایید.";
                break;
            case ESentences.incorect:
                sentence = "{0} صحیح نمی باشد.";
                break;
                case ESentences.confirmJs:
                sentence = string.Format("javascript:return ShowConfirm('{0}')", "آیا از {0} مطمئن هستید؟");
                break;
        }

        return sentence;
    }

    /// <summary>
    /// request: order(anonymous), offer(anonymous)
    /// </summary>
    public static bool SendEmailForRequest(string name, string[] emails)
    {
        StringBuilder stringBuilder = new StringBuilder();

        stringBuilder.Append("<div dir='rtl'>");
        stringBuilder.Append("با سلام");
        stringBuilder.Append("<br />");
        stringBuilder.Append("<br />");
        stringBuilder.Append(string.Format("کاربر گرامی{0}پیام شما با موفقیت در سیستم ثبت شد.", name));
        stringBuilder.Append("<br />");
        stringBuilder.Append("در کوتاه ترین زمان یکی از مدیران سایت به پیام شما پاسخ خواهد داد.");
        stringBuilder.Append("<br />");
        stringBuilder.Append("این پیام بصورت خودکار فرستاده شده است.");
        stringBuilder.Append("<br />");
        stringBuilder.Append("<br />");
        stringBuilder.Append("با تشکر ");
        stringBuilder.Append("<a href='http://www.minoosoft.ir/'>مینوسافت</a>");
        stringBuilder.Append("</div>");

        return MailHelper.SendSimple(emails, "نتیجه ثبت پیام", stringBuilder.ToString());
    }

    public static string SiteAddress(HttpRequest request, bool withApplicationPath = true)
    {
        var url = request.Url.GetLeftPart(UriPartial.Authority);

        if (withApplicationPath)
            url += request.ApplicationPath;

        return url;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="addNum">1 or -1 or 0(تنها برای گرفتن مقدار جاری بکار می رود)</param>
    /// <param name="application"></param>
    /// <returns></returns>
    public static int VisitorsCountManager(int addNum = 0, HttpApplicationState application = null)
    {
        string key = "VisitorsCount";
        int count;

        if (application == null)
            application = HttpContext.Current.Application;

        application.Lock();

        if (application[key] == null)
            application[key] = 0;
        
        application[key] = int.Parse(application[key].ToString()) + addNum;

        count = int.Parse(application[key].ToString());
        
        application.UnLock();

        return count;
    }

    #endregion

}